package com.sise.Array;

/**
 *      7. 整数反转
 *
 *      给你一个 32 位的有符号整数 x ，返回将 x 中的数字部分反转后的结果。
 *      如果反转后整数超过 32 位的有符号整数的范围[−2^31, 2^31− 1] ，就返回 0。
 *      假设环境不允许存储 64 位整数（有符号或无符号）。
 *
 *      输入：x = 123
 *      输出：321
 *
 *      1423 -> 3241
 *      过程：
 *          1423 % 10 = 3  ~~(1423 / 10) = 142
 *          142 % 10 =  2  ~~(142 / 10)  = 14
 *          14 % 10 =   4  ~~(14 / 10)   = 1
 *          1 % 10 =    1  ~~(1 / 10)    = 0
 *
 *      可以看到取模后的数值便是 最终数值，一开始将 result = 0
 *          0 * 10 + 3 = 3
 *          3 * 10 + 2 = 32
 *          32 * 10 + 4 = 324
 *          324 * 10 + 1 = 3241
 *
 */
public class _07_reverse {
    public int reverse(int x) {
        int result = 0;
        while (x != 0) {
            int mo = x % 10;            // 当前值取模后的数字，例如 1423 % 10 = 3

            // 当出现 ans > MAX_VALUE / 10 且 还有pop需要添加 时，则一定溢出；
            // 当出现 ans == MAX_VALUE / 10 且 pop > 7 时，则一定溢出，7 是 2^31 - 1的个位数
            if (result > Integer.MAX_VALUE / 10 || (result == Integer.MAX_VALUE / 10 && mo > 7)) {
                return 0;
            }

            // 当出现 ans < MIN_VALUE / 10 且 还有pop需要添加 时，则一定溢出
            // 当出现 ans == MIN_VALUE / 10 且 pop < -8 时，则一定溢出，8是-2^31的个位数
            if (result < Integer.MIN_VALUE / 10 || (result == Integer.MIN_VALUE / 10 && mo < -8)) {
                return 0;
            }

            result = result * 10 + mo;  // 当前结果乘以十，再加上取模后的数值
            x = x / 10;
        }
        return result;
    }
}